~ 反覆測試是提升軟體品質唯一途徑 ~
github: https://github.com/slindevel/modern-aws-marathon
今天我們使用昨天的模型來進行回溯測試,驗證模型是否有效
一樣先部署環境
$ aws cloudformation create-stack --stack-name algorithmic-trading --template-body file://Day26/cloudformation.yaml --capabilities CAPABILITY_IAM
然後進到 SageMaker Notebook Instance ,打開 AlgorithmicTradingXXX 這個 Instance,一樣我們 kernel 選擇 conda_python3
然後開啟 Strategy_ML_Forecast.ipynb 這個 notebook,照順序執行
在這份筆記中,我們將會使用昨日產生的模型來進行回測
可以把先前的訓練模型 .h5 放到 Day28/model/model_long_short_predict.h5
一樣我們利用 athena 直接從 S3 把資料撈出來
一直到 dfTest["close"].plot()
會畫出簡單的 Daily 收盤價圖表
在下面的單元格中,您可以調整策略的參數。
可以調整 hyperparameters.json 的參數如下:
user = 名稱(可選)
long_threshold = 多頭交易的閾值(0 到 1)
short_threshold = 空頭交易的閾值(0 到 1)
profit_target_pct = 利潤目標百分比
stop_target_pct = 止損目標百分比
size = 交易的股數
提改進策略的一個好的起點是修改利潤目標/止損目標以及風險/回報比。
另一個選擇是通過增加閾值來減少信號的數量。
第一次執行我們先採用以下參數:
{ "user" : "user",
"long_threshold" : "0.5",
"short_threshold" : "0.5",
"profit_target_pct" : "2.00",
"stop_target_pct" : "1.50",
"size" : "100"
}
接著是核心策略程式
重點如下:
next 方法是策略的核心,它在每個交易日呼叫一次。在這裡,策略計算技術指標(SMA和ROC)並準備模型的輸入數據。
inputRec 是用於存儲輸入數據的列表,包括日期(dt)和收盤價(close)。
接下來是計算SMA(簡單移動平均)和ROC(變化率)技術指標,並將它們添加到 inputRec 中。
型預測兩個值,分別代表長期和短期的信號(tLong和tShort)。
如果策略目前沒有持倉(position),則根據預測的信號和閾值,判斷是進行多頭交易(buy)還是空頭交易(sell)。如果預測的tLong大於長期閾值,則執行多頭交易;如果預測的tShort大於短期閾值,則執行空頭交易。
如果策略目前有持倉,則根據限價價格(limitPrice)和停損價格(stopPrice)來判斷是否應該平倉。
總之,這個策略將深度學習模型的預測信號與技術指標結合在一起,來做出交易決策,並根據預定的利潤目標和停損目標來進行風險管理。
第一次因為要初始化 docker build image,時間會比較久
輸出圖表如下:
接著我們可以重複 修改策略配置 ~ 執行本地端回溯測試 步驟來調整我們的策略
調整完畢之後可以將 docker image 推送到 ECR 上準備部署到 SageMaker 的 ECS 上
引用SageMaker相關的庫和工具:
import sagemaker as sage: 引用SageMaker的Python SDK。
from sagemaker import get_execution_role: 從SageMaker庫中引入用於獲取執行角色的函數。
from sagemaker.estimator import Estimator: 引入SageMaker估算器,用於定義和訓練機器學習模型。
獲取SageMaker執行角色和建立SageMaker會話:
role = get_execution_role(): 使用get_execution_role函數獲取SageMaker的執行角色,該角色賦予了運行SageMaker作業的權限。
sess = sage.Session(): 建立SageMaker會話,用於管理SageMaker作業。
上傳訓練數據到S3存儲桶:
WORK_DIRECTORY定義了本地訓練數據的目錄。
data_location = sess.upload_data(WORK_DIRECTORY, key_prefix='data'):使用SageMaker會話的upload_data方法將本地訓練數據上傳到S3存儲桶中,同時指定了上傳的目標路徑。
讀取並設置模型的 hyperparameters 配置:
conf_file定義了超參數配置文件的路徑。
使用 json.load(f) 讀取超參數配置文件,並將其存儲在config變數中。
配置 SageMaker 估算器:
prefix 和 job_name 用於定義作業名稱。
account 和 region用於獲取AWS帳戶和區域信息。
image 指定了 Docker 映像的 URI,其中包含了要運行的機器學習算法。
algo = sage.estimator.Estimator(...): 創建一個SageMaker估算器,配置了執行訓練作業所需的所有參數,包括執行角色、實例數量、實例類型、輸出路徑、超參數等。
訓練模型:
algo.fit(data_location): 使用估算器的 fit 方法開始訓練模型,並將訓練數據從 S3 存儲桶中讀取。訓練完成後,模型的結果和輸出將被存儲在指定的 S3 存儲桶中。
最後我們得到一組關於回測的績效數字:
完全沒調整參數的夏普 ratio 是負的XD
最後別忘了清理資源:
$ aws cloudformation delete-stack --stack-name algorithmic-trading